//路由鉴权，鉴权：项目当中路由能不能被访问的权限的设置（某一个路由什么条件下可以访问，什么条件下不可以访问）
import router from "@/router";
//引入项目logo、名称组件
import Setting from '@/setting'
//引入进度条组件nprogress
//@ts-ignore
import nprogress from 'nprogress'
//引入进度条nprogress的css样式
import "nprogress/nprogress.css"
nprogress.configure({ showSpinner: false });
//组件外部获取小仓库。必须引入大仓库
import pinia from "./store";
//获取用户相关的小仓库的token数据，用来判断用户是否登录成功
import useUserStore from "./store/modules/user";
let userStore = useUserStore(pinia);
//第一个问题：任意路由切换实现进度条业务----nprogress
//第二个问题：路由鉴权（路由组件访问权限的设置）
//全部路由组件：登录、404、任意、首页二级、数据大屏、权限管理（三个子路由）、商品管理（四个子路由）
//用户未登录：可以方位login，其余路由不能访问（指向login）
//登录成功：不能访问login，指向首页,其余的路由可以访问。


//全局守卫：项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to, from, next) => {
    document.title = Setting.title + "-" + to.meta.title;
    //访问某一个路由之前的守卫,to将要访问那个路由,from从那个路由而来,next 路由的放行函数
    nprogress.start()
    //获取token判断用户是否登录
    const token = userStore.token;
    //获取用户的名字
    const username = userStore.username;
    if (token) { //用户登录
        //登录成功访问login，不能访问，指向首页
        if (to.path == '/login') {
            next({ path: '/' })
        } else {
            //有用户信息，进行放行
            if (username) {
                next();
            } else {
                //如果没有用户信息，在守卫这里发请求获取到了用户信息在放行
                try {
                    await userStore.userInfo();
                    //放行
                    //万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果
                    next({ ...to })
                } catch (error) {
                    //1、token过期 2、用户手动修改本地存储的token
                    //退出登录-》用户相关信息清空
                    await userStore.userLogout();
                    next({ path: '/login', query: { rediret: to.path } });
                }
            }
        }
    } else { //用户未登录
        if (to.path == '/login') { //用户未登录访问登录页面，放行
            next();
        } else {
            next({ path: '/login', query: { redirect: to.path } }); //用户未登录访问其他页面，跳转到登录页面
        }
    }
    nprogress.start(); //路由切换进度条
    next();
})

//全局后置守卫
router.afterEach((to, from) => {
    // to and from are both route objects.
    nprogress.done();

})

